package com.demo.test;


import java.util.concurrent.CountDownLatch;

/**
 * 尚硅谷大厂面试
 * 让一线程阻塞直到另一些线程完成一系列操作才被唤醒。
 *
 * CountDownLatch主要有两个方法（await()，countDown()）。
 * CountDownLatch是一个同步的辅助类，允许一个或多个线程，等待其他一组线程完成操作，再继续执行。
 * CyclicBarrier是一个同步的辅助类，允许一组线程相互之间等待，达到一个共同点，再继续执行。
 *  CountDownLatch: 一个线程(或者多个)， 等待另外N个线程完成某个事情之后才能执行。
 *  CyclicBrrier: N个线程相互等待，任何一个线程完成之前，所有的线程都必须等待。
 *
 *  CountDownLatch和CyclicBarrier都是用作多线程同步，CountDownLatch基于AQS，CyclicBarrier基于ReentrantLock
 *  CyclicBarrier支持复用和barrierCommand，但是CountDownLatch不支持。
 *  CyclicBarrier会阻塞线程，在最后一个任务执行线程完成之前，其余线程都必须等待，而线程在调用CountDownLatch的countDown方法之后就会结束。
 *
 *
 */
public class CountDownLatchDemo {

    public static void main(String[] args) throws InterruptedException {

        // 计数器
        CountDownLatch countDownLatch = new CountDownLatch(6);

        for(int i=1;i<=6;i++){
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "\t 上完自习，离开教室");
                countDownLatch.countDown();
            }, String.valueOf(i)).start();
        }

        countDownLatch.await();

        System.out.println(Thread.currentThread().getName() + "\t 班长最后关门");

    }


}
